๋์ import ๋ฐ webpack ์ค์ ์ ํ์ฉํ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋ ์คํ๋ฆฌํ ๊ธฐ๋ฒ์ ํตํด ์น์ฌ์ดํธ ์ฑ๋ฅ์ ์ต์ ํํ๊ณ ์ฌ์ฉ์ ๊ฒฝํ์ ํฅ์์ํค๋ ๋ฐฉ๋ฒ์ ์์๋ณด์ธ์. ์ ์ธ๊ณ ๊ฐ๋ฐ์๋ฅผ ์ํ ์ข ํฉ ๊ฐ์ด๋์ ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋ ์คํ๋ฆฌํ : ๋์ ๋ก๋ฉ๊ณผ ์ฑ๋ฅ ์ต์ ํ
๋์์์ด ์งํํ๋ ์น ๊ฐ๋ฐ ํ๊ฒฝ์์, ๋งค๋๋ฝ๊ณ ์ฑ๋ฅ์ด ๋ฐ์ด๋ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ๋ ๊ฒ์ ๊ฐ์ฅ ์ค์ํฉ๋๋ค. ํ๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ค์ถ์ธ ์๋ฐ์คํฌ๋ฆฝํธ๋ ์ข ์ข ํ์ด์ง ๋ก๋ ์๊ฐ์ ์๋นํ ์ํฅ์ ๋ฏธ์นฉ๋๋ค. ํฐ ์๋ฐ์คํฌ๋ฆฝํธ ๋ฒ๋ค์ ์ด๊ธฐ ๋ก๋ฉ ์๋๋ฅผ ์ ํ์์ผ ์ฌ์ฉ์ ์ฐธ์ฌ๋์ ์ ๋ฐ์ ์ธ ๋ง์กฑ๋์ ์ํฅ์ ์ค ์ ์์ต๋๋ค. ๋ฐ๋ก ์ด ์ง์ ์์ ์ฝ๋ ์คํ๋ฆฌํ (code splitting)์ด ํด๊ฒฐ์ฑ ์ผ๋ก ๋ฑ์ฅํฉ๋๋ค. ์ด ์ข ํฉ ๊ฐ์ด๋์์๋ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋ ์คํ๋ฆฌํ ์ ๋ณต์กํ ๋ด์ฉ๋ค์ ๊น์ด ํ๊ณ ๋ค์ด ๊ทธ ์ด์ , ๋ค์ํ ๊ธฐ๋ฒ, ๊ทธ๋ฆฌ๊ณ ๋์ ๋ก๋ฉ์ ์ด์ ์ ๋ง์ถ ์ค์ฉ์ ์ธ ๊ตฌํ ์ ๋ต์ ํ๊ตฌํ ๊ฒ์ ๋๋ค.
์ฝ๋ ์คํ๋ฆฌํ ์ด๋ ๋ฌด์์ธ๊ฐ?
์ฝ๋ ์คํ๋ฆฌํ ์ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ๋ ์๊ณ ๊ด๋ฆฌํ๊ธฐ ์ฌ์ด ์ฒญํฌ(chunks) ๋๋ ๋ฒ๋ค(bundles)๋ก ๋๋๋ ๊ธฐ์ ์ ๋๋ค. ์ด๊ธฐ ํ์ด์ง ๋ก๋ ์ ํ๋์ ๊ฑฐ๋ํ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ์ ๋ก๋ํ๋ ๋์ , ์ฝ๋ ์คํ๋ฆฌํ ์ ์ฌ์ฉํ๋ฉด ์ด๊ธฐ ๋ ๋๋ง์ ํ์ํ ์ฝ๋๋ง ๋ก๋ํ๊ณ ๋ค๋ฅธ ๋ถ๋ถ์ ๋ก๋ฉ์ ์ค์ ๋ก ํ์ํ ๋๊น์ง ์ง์ฐ์ํฌ ์ ์์ต๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ์ด๊ธฐ ๋ฒ๋ค ํฌ๊ธฐ๋ฅผ ํฌ๊ฒ ์ค์ฌ ํ์ด์ง ๋ก๋ ์๊ฐ์ ๋จ์ถํ๊ณ ๋ ๋ฐ์์ด ๋น ๋ฅธ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ๋ง๋ญ๋๋ค.
์ด๋ ๊ฒ ์๊ฐํด๋ณด์ธ์: ๋น์ ์ด ์ํฌ๋ฅผ ๋ณด๋ธ๋ค๊ณ ์์ํด๋ณด์ธ์. ๋ชจ๋ ๊ฒ์ ํ๋์ ๊ฑฐ๋ํ ์์์ ํฌ์ฅํ๋ ๋์ , ๊ด๋ จ ํ๋ชฉ์ ๋ด์ ๋ ์๊ณ ๊ด๋ฆฌํ๊ธฐ ์ฌ์ด ์ฌ๋ฌ ์์๋ก ๋๋๋๋ค. ๊ฐ์ฅ ์ค์ํ ์์๋ฅผ ๋จผ์ ๋ณด๋ด๊ณ ๋๋จธ์ง๋ ํ์์ ๋ฐ๋ผ ๋์ค์ ๋ณด๋ ๋๋ค. ์ด๊ฒ์ด ์ฝ๋ ์คํ๋ฆฌํ ์ด ์๋ํ๋ ๋ฐฉ์๊ณผ ์ ์ฌํฉ๋๋ค.
์ฝ๋ ์คํ๋ฆฌํ ์ ์ ์ค์ํ๊ฐ?
์ฝ๋ ์คํ๋ฆฌํ ์ ์ด์ ์ ๋ค์ํ๋ฉฐ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ์ฉ์ ๊ฒฝํ๊ณผ ์ ๋ฐ์ ์ธ ์ฑ๋ฅ์ ์ง์ ์ ์ธ ์ํฅ์ ๋ฏธ์นฉ๋๋ค:
- ์ด๊ธฐ ๋ก๋ ์๊ฐ ๊ฐ์ : ์ด๊ธฐ ๋ฒ๋ค ํฌ๊ธฐ๋ฅผ ์ค์์ผ๋ก์จ, ์ฝ๋ ์คํ๋ฆฌํ ์ ํ์ด์ง๊ฐ ์ํธ์์ฉ ๊ฐ๋ฅํด์ง๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ํฌ๊ฒ ๋จ์ถ์ํต๋๋ค. ์ด๋ ์ฌ์ฉ์ ์ฃผ์๋ฅผ ๋๊ณ ์ดํ๋ฅ ์ ๋ฐฉ์งํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค.
- ์ฌ์ฉ์ ๊ฒฝํ ํฅ์: ๋ ๋น ๋ฅธ ๋ก๋ ์๊ฐ์ ๋ ๋ถ๋๋ฝ๊ณ ๋ฐ์์ด ๋น ๋ฅธ ์ฌ์ฉ์ ๊ฒฝํ์ผ๋ก ์ด์ด์ง๋๋ค. ์ฌ์ฉ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ ๋น ๋ฅด๊ณ ํจ์จ์ ์ด๋ผ๊ณ ์ธ์ํฉ๋๋ค.
- ๋์ญํญ ์๋น ๊ฐ์: ํ์ํ ์ฝ๋๋ง ๋ก๋ํจ์ผ๋ก์จ, ์ฝ๋ ์คํ๋ฆฌํ ์ ๋คํธ์ํฌ๋ฅผ ํตํด ์ ์ก๋๋ ๋ฐ์ดํฐ ์์ ์ต์ํํฉ๋๋ค. ์ด๋ ๋์ญํญ์ด ์ ํ์ ์ด๊ฑฐ๋ ์ฐ๊ฒฐ ์ํ๊ฐ ์ข์ง ์์ ์ง์ญ์ ๋ชจ๋ฐ์ผ ์ฅ์น๋ฅผ ์ฌ์ฉํ๋ ์ฌ์ฉ์์๊ฒ ํนํ ์ค์ํฉ๋๋ค.
- ๋ ๋์ ์บ์ ํ์ฉ: ์ฝ๋๋ฅผ ๋ ์์ ์ฒญํฌ๋ก ๋ถํ ํ๋ฉด ๋ธ๋ผ์ฐ์ ๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ค๋ฅธ ๋ถ๋ถ์ ๋ ํจ๊ณผ์ ์ผ๋ก ์บ์ํ ์ ์์ต๋๋ค. ์ฌ์ฉ์๊ฐ ๋ค๋ฅธ ์น์ ์ด๋ ํ์ด์ง๋ก ์ด๋ํ ๋, ๋ค๋ฅธ ๋ถ๋ถ์ ์ด๋ฏธ ์บ์๋์ด ์์ ์ ์์ผ๋ฏ๋ก ํ์ํ ์ฝ๋๋ง ๋ค์ด๋ก๋ํ๋ฉด ๋ฉ๋๋ค. ๊ธ๋ก๋ฒ ์ ์์๊ฑฐ๋ ์ฌ์ดํธ๋ฅผ ์์ํด๋ณด์ธ์. ์ ๋ฝ ์ฌ์ฉ์๋ ์์์ ์ฌ์ฉ์์ ๋ค๋ฅธ ์ํ ์นดํ๋ก๊ทธ์ ์ํธ์์ฉํ ์ ์์ต๋๋ค. ์ฝ๋ ์คํ๋ฆฌํ ์ ๊ด๋ จ ์นดํ๋ก๊ทธ ์ฝ๋๋ง ์ด๊ธฐ์ ๋ค์ด๋ก๋๋๋๋ก ๋ณด์ฅํ์ฌ ๋ ์ฌ์ฉ์ ๊ทธ๋ฃน ๋ชจ๋์ ๋์ญํญ์ ์ต์ ํํฉ๋๋ค.
- ๋ชจ๋ฐ์ผ์ ์ต์ ํ: ๋ชจ๋ฐ์ผ ์ฐ์ ์๋์๋ ์ฑ๋ฅ ์ต์ ํ๊ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค. ์ฝ๋ ์คํ๋ฆฌํ ์ ๋ชจ๋ฐ์ผ ์์ฐ์ ํฌ๊ธฐ๋ฅผ ์ค์ด๊ณ ๋๋ฆฐ ๋คํธ์ํฌ์์๋ ๋ชจ๋ฐ์ผ ์ฅ์น์ ๋ก๋ ์๊ฐ์ ๊ฐ์ ํ๋ ๋ฐ ์ค์ํ ์ญํ ์ ํฉ๋๋ค.
์ฝ๋ ์คํ๋ฆฌํ ์ ์ข ๋ฅ
์ฃผ๋ก ๋ ๊ฐ์ง ์ฃผ์ ์ ํ์ ์ฝ๋ ์คํ๋ฆฌํ ์ด ์์ต๋๋ค:
- ์ปดํฌ๋ํธ ๊ธฐ๋ฐ ๋ถํ : ์ ํ๋ฆฌ์ผ์ด์ ๋ด์ ๊ฐ๋ณ ์ปดํฌ๋ํธ๋ ๋ชจ๋์ ๊ธฐ๋ฐ์ผ๋ก ์ฝ๋๋ฅผ ๋ถํ ํฉ๋๋ค. ์ด๋ ํฌ๊ณ ๋ณต์กํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ์ฅ ํจ๊ณผ์ ์ธ ์ ๊ทผ ๋ฐฉ์์ธ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค.
- ๋ผ์ฐํธ ๊ธฐ๋ฐ ๋ถํ : ์ ํ๋ฆฌ์ผ์ด์ ๋ด์ ๋ค๋ฅธ ๋ผ์ฐํธ๋ ํ์ด์ง๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ฝ๋๋ฅผ ๋ถํ ํฉ๋๋ค. ์ด๋ฅผ ํตํด ํ์ฌ ๋ผ์ฐํธ์ ํ์ํ ์ฝ๋๋ง ๋ก๋๋๋๋ก ๋ณด์ฅํฉ๋๋ค.
์ฝ๋ ์คํ๋ฆฌํ ๊ตฌํ ๊ธฐ๋ฒ
์๋ฐ์คํฌ๋ฆฝํธ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฝ๋ ์คํ๋ฆฌํ ์ ๊ตฌํํ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ ๋ช ๊ฐ์ง ๊ธฐ๋ฒ์ด ์์ต๋๋ค:
- ๋์ Import (
import()):๋์ import๋ ์ฝ๋ ์คํ๋ฆฌํ ์ ๊ตฌํํ๋ ๊ฐ์ฅ ํ๋์ ์ด๊ณ ๊ถ์ฅ๋๋ ๋ฐฉ๋ฒ์ ๋๋ค. ์ด๋ฅผ ํตํด ๋ฐํ์์ ์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋์ ๋น๋๊ธฐ์ ์ผ๋ก ๋ก๋ํ์ฌ ์ฝ๋๊ฐ ์ธ์ ์ด๋ป๊ฒ ๋ก๋๋๋์ง์ ๋ํ ์ธ๋ฐํ ์ ์ด๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
์์:
// ์ด์ : // import MyComponent from './MyComponent'; // ์ดํ (๋์ Import): async function loadMyComponent() { const { default: MyComponent } = await import('./MyComponent'); // ์ฌ๊ธฐ์ MyComponent ์ฌ์ฉ } // ์ปดํฌ๋ํธ๊ฐ ํ์ํ ๋ ํจ์ ํธ์ถ loadMyComponent();์ด ์์์์
MyComponent๋ชจ๋์loadMyComponent()ํจ์๊ฐ ํธ์ถ๋ ๋๋ง ๋ก๋๋ฉ๋๋ค. ์ด๋ ์ฌ์ฉ์ ์ํธ์์ฉ, ๋ผ์ฐํธ ๋ณ๊ฒฝ ๋๋ ๋ค๋ฅธ ์ด๋ค ์ด๋ฒคํธ์ ์ํด์๋ ํธ๋ฆฌ๊ฑฐ๋ ์ ์์ต๋๋ค.๋์ Import์ ์ด์ :
- ๋น๋๊ธฐ ๋ก๋ฉ: ๋ชจ๋์ ๋ฉ์ธ ์ค๋ ๋๋ฅผ ์ฐจ๋จํ์ง ์๊ณ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ๋ก๋๋ฉ๋๋ค.
- ์กฐ๊ฑด๋ถ ๋ก๋ฉ: ํน์ ์กฐ๊ฑด์ด๋ ์ฌ์ฉ์ ์ํธ์์ฉ์ ๋ฐ๋ผ ๋ชจ๋์ ๋ก๋ํ ์ ์์ต๋๋ค.
- ๋ฒ๋ค๋ฌ์์ ํตํฉ: ๋๋ถ๋ถ์ ํ๋์ ์ธ ๋ฒ๋ค๋ฌ(Webpack, Parcel ๋ฑ)๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋์ import๋ฅผ ์ง์ํฉ๋๋ค.
- Webpack ์ค์ :
์ธ๊ธฐ ์๋ ์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋ ๋ฒ๋ค๋ฌ์ธ Webpack์ ์ฝ๋ ์คํ๋ฆฌํ ์ ์ํ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. Webpack์ ์ค์ ํ์ฌ ์ง์ ์ (entry points), ๋ชจ๋ ํฌ๊ธฐ, ์์กด์ฑ ๋ฑ ๋ค์ํ ๊ธฐ์ค์ ๋ฐ๋ผ ์ฝ๋๋ฅผ ์๋์ผ๋ก ๋ถํ ํ ์ ์์ต๋๋ค.
Webpack์
splitChunks์ค์ ์ต์ :์ด๊ฒ์ Webpack ๋ด์์ ์ฝ๋ ์คํ๋ฆฌํ ์ ์ํ ์ฃผ์ ๋ฉ์ปค๋์ฆ์ ๋๋ค. ๊ณต์ ๋ ์์กด์ฑ์ด๋ ๋ชจ๋ ํฌ๊ธฐ์ ๋ฐ๋ผ ๋ณ๋์ ์ฒญํฌ๋ฅผ ์์ฑํ๋ ๊ท์น์ ์ ์ํ ์ ์์ต๋๋ค.
์์ (webpack.config.js):
module.exports = { // ... ๊ธฐํ ์นํฉ ์ค์ optimization: { splitChunks: { chunks: 'all', // ๋ชจ๋ ์ฒญํฌ ๋ถํ (๋น๋๊ธฐ ๋ฐ ์ด๊ธฐ) cacheGroups: { vendor: { test: /[\\/]node_modules[\\/]/, // node_modules์ ๋ชจ๋๊ณผ ์ผ์น name: 'vendors', // ๊ฒฐ๊ณผ ์ฒญํฌ์ ์ด๋ฆ chunks: 'all', }, }, }, }, };์ด ์์์์ Webpack์
node_modules๋๋ ํ ๋ฆฌ์ ๋ชจ๋ ๋ชจ๋์ ํฌํจํ๋vendors๋ผ๋ ๋ณ๋์ ์ฒญํฌ๋ฅผ ์์ฑํ๋๋ก ์ค์ ๋์์ต๋๋ค. ์ด๋ ์๋ํํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋์ ๋ถ๋ฆฌํ์ฌ ๋ธ๋ผ์ฐ์ ๊ฐ ์ด๋ฅผ ๋ณ๋๋ก ์บ์ํ ์ ์๋๋ก ํ๋ ์ผ๋ฐ์ ์ธ ๊ดํ์ ๋๋ค.splitChunks์ ์ค์ ์ต์ :chunks: ๋ถํ ๋์์ผ๋ก ๊ณ ๋ คํ ์ฒญํฌ๋ฅผ ์ง์ ํฉ๋๋ค ('all','async', ๋๋'initial').minSize: ์์ฑ๋ ์ฒญํฌ์ ์ต์ ํฌ๊ธฐ(๋ฐ์ดํธ ๋จ์)๋ฅผ ์ค์ ํฉ๋๋ค.maxSize: ์ฒญํฌ์ ์ต๋ ํฌ๊ธฐ(๋ฐ์ดํธ ๋จ์)๋ฅผ ์ค์ ํฉ๋๋ค.minChunks: ๋ชจ๋์ด ๋ถํ ๋๊ธฐ ์ ์ ๊ณต์ ํด์ผ ํ๋ ์ต์ ์ฒญํฌ ์๋ฅผ ์ง์ ํฉ๋๋ค.maxAsyncRequests: ์จ๋๋งจ๋ ๋ก๋ฉ ์ ๋ณ๋ ฌ ์์ฒญ ์๋ฅผ ์ ํํฉ๋๋ค.maxInitialRequests: ์ง์ ์ ์์์ ๋ณ๋ ฌ ์์ฒญ ์๋ฅผ ์ ํํฉ๋๋ค.automaticNameDelimiter: ๋ถํ ๋ ์ฒญํฌ์ ์ด๋ฆ์ ์์ฑํ๋ ๋ฐ ์ฌ์ฉ๋๋ ๊ตฌ๋ถ ๊ธฐํธ์ ๋๋ค.name: ๋ถํ ๋ ์ฒญํฌ์ ์ด๋ฆ์ ์์ฑํ๋ ํจ์์ ๋๋ค.cacheGroups: ๋ค์ํ ๊ธฐ์ค(์: ๋ฒค๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ, ๊ณต์ ์ปดํฌ๋ํธ)์ ๋ฐ๋ผ ํน์ ์ฒญํฌ๋ฅผ ์์ฑํ๋ ๊ท์น์ ์ ์ํฉ๋๋ค. ์ด๊ฒ์ด ๊ฐ์ฅ ๊ฐ๋ ฅํ๊ณ ์ ์ฐํ ์ต์ ์ ๋๋ค.
Webpack ์ค์ ์ ์ด์ :
- ์๋ ์ฝ๋ ์คํ๋ฆฌํ : Webpack์ ๋ฏธ๋ฆฌ ์ ์๋ ๊ท์น์ ๋ฐ๋ผ ์ฝ๋๋ฅผ ์๋์ผ๋ก ๋ถํ ํ ์ ์์ต๋๋ค.
- ์ธ๋ฐํ ์ ์ด: ๋ค์ํ ์ค์ ์ต์ ์ ์ฌ์ฉํ์ฌ ๋ถํ ํ๋ก์ธ์ค๋ฅผ ๋ฏธ์ธ ์กฐ์ ํ ์ ์์ต๋๋ค.
- ๋ค๋ฅธ Webpack ๊ธฐ๋ฅ๊ณผ์ ํตํฉ: ์ฝ๋ ์คํ๋ฆฌํ ์ ํธ๋ฆฌ ์์ดํน(tree shaking) ๋ฐ ์ถ์(minification)์ ๊ฐ์ ๋ค๋ฅธ Webpack ๊ธฐ๋ฅ๊ณผ ์ํํ๊ฒ ์๋ํฉ๋๋ค.
- React.lazy์ Suspense (React ์ ํ๋ฆฌ์ผ์ด์
์ฉ):
React ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ๊ฒฝ์ฐ
React.lazy์Suspense์ปดํฌ๋ํธ๋ฅผ ํ์ฉํ์ฌ ์ฝ๋ ์คํ๋ฆฌํ ์ ์ฝ๊ฒ ๊ตฌํํ ์ ์์ต๋๋ค.React.lazy๋ React ์ปดํฌ๋ํธ๋ฅผ ๋์ ์ผ๋ก importํ ์ ์๊ฒ ํด์ฃผ๋ฉฐ,Suspense๋ ์ปดํฌ๋ํธ๊ฐ ๋ก๋๋๋ ๋์ ํด๋ฐฑ UI(์: ๋ก๋ฉ ํ์๊ธฐ)๋ฅผ ํ์ํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค.์์:
import React, { Suspense } from 'react'; const MyComponent = React.lazy(() => import('./MyComponent')); function MyPage() { return (Loading...
์ด ์์์์ MyComponent ์ปดํฌ๋ํธ๋ React.lazy๋ฅผ ์ฌ์ฉํ์ฌ ๋์ ์ผ๋ก ๋ก๋๋ฉ๋๋ค. Suspense ์ปดํฌ๋ํธ๋ ์ปดํฌ๋ํธ๊ฐ ๋ก๋๋๋ ๋์ ๋ก๋ฉ ํ์๊ธฐ๋ฅผ ํ์ํฉ๋๋ค.
React.lazy์ Suspense์ ์ด์ :
- ๊ฐ๋จํ๊ณ ์ ์ธ์ ์ธ ๊ตฌ๋ฌธ: ์ต์ํ์ ์ฝ๋ ๋ณ๊ฒฝ์ผ๋ก ์ฝ๋ ์คํ๋ฆฌํ ์ ๊ตฌํํ ์ ์์ต๋๋ค.
- React์์ ์ํํ ํตํฉ:
React.lazy์Suspense๋ React์ ๋ด์ฅ๋ ๊ธฐ๋ฅ์ ๋๋ค. - ๊ฐ์ ๋ ์ฌ์ฉ์ ๊ฒฝํ:
Suspense์ปดํฌ๋ํธ๋ ๋ก๋ฉ ํ์๊ธฐ๋ฅผ ํ์ํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ์ฌ ์ปดํฌ๋ํธ๊ฐ ๋ก๋๋๋ ๋์ ์ฌ์ฉ์๊ฐ ๋น ํ๋ฉด์ ๋ณด์ง ์๋๋ก ํฉ๋๋ค.
๋์ ๋ก๋ฉ ๋ ์ ์ ๋ก๋ฉ
๋์ ๋ก๋ฉ๊ณผ ์ ์ ๋ก๋ฉ์ ์ฃผ์ ์ฐจ์ด์ ์ ์ฝ๋๊ฐ ๋ก๋๋๋ ์์ ์ ์์ต๋๋ค:
- ์ ์ ๋ก๋ฉ: ๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๊ฐ ์ด๊ธฐ ๋ฒ๋ค์ ํฌํจ๋์ด ํ์ด์ง๊ฐ ์ฒ์ ๋ก๋๋ ๋ ๋ก๋๋ฉ๋๋ค. ์ด๋ ํนํ ๋๊ท๋ชจ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฒฝ์ฐ ์ด๊ธฐ ๋ก๋ ์๊ฐ์ ๋ฆ์ถ ์ ์์ต๋๋ค.
- ๋์ ๋ก๋ฉ: ์ฝ๋๋ ํ์ํ ๋๋ง ์จ๋๋งจ๋(on-demand) ๋ฐฉ์์ผ๋ก ๋ก๋๋ฉ๋๋ค. ์ด๋ ์ด๊ธฐ ๋ฒ๋ค ํฌ๊ธฐ๋ฅผ ์ค์ด๊ณ ์ด๊ธฐ ๋ก๋ ์๊ฐ์ ๊ฐ์ ํฉ๋๋ค.
๋์ ๋ก๋ฉ์ ์ด๊ธฐ ๋ก๋ ์ ํ์ํ ์ฝ๋๋ง ๋ก๋๋๋๋ก ๋ณด์ฅํ๋ฏ๋ก ์ผ๋ฐ์ ์ผ๋ก ์ฑ๋ฅ ์ต์ ํ์ ๋ ์ ํธ๋ฉ๋๋ค. ์ด๋ ๋จ์ผ ํ์ด์ง ์ ํ๋ฆฌ์ผ์ด์ (SPA)๊ณผ ๋ง์ ๊ธฐ๋ฅ์ ๊ฐ์ง ๋ณต์กํ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ํนํ ์ค์ํฉ๋๋ค.
์ฝ๋ ์คํ๋ฆฌํ ๊ตฌํ: ์ค์ฉ ์์ (React์ Webpack)
Webpack์ ์ฌ์ฉํ์ฌ React ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฝ๋ ์คํ๋ฆฌํ ์ ๊ตฌํํ๋ ์ค์ ์์ ๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
- ํ๋ก์ ํธ ์ค์ :
Create React App ๋๋ ์ ํธํ๋ ์ค์ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ์ฌ ์ React ํ๋ก์ ํธ๋ฅผ ์์ฑํฉ๋๋ค.
- ์์กด์ฑ ์ค์น:
webpack๊ณผwebpack-cli๊ฐ ๊ฐ๋ฐ ์์กด์ฑ(development dependencies)์ผ๋ก ์ค์น๋์ด ์๋์ง ํ์ธํฉ๋๋ค.npm install --save-dev webpack webpack-cli - ์ปดํฌ๋ํธ ๊ตฌ์กฐ:
๋์ ์ผ๋ก ๋ก๋ํ๋ ค๋ ํ๋ ์ด์์ ์ปดํฌ๋ํธ๋ฅผ ํฌํจํ์ฌ ๋ช ๊ฐ์ง React ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ญ๋๋ค. ์๋ฅผ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
// MyComponent.js import React from 'react'; function MyComponent() { returnThis is MyComponent!; } export default MyComponent; - React.lazy์ Suspense๋ฅผ ์ด์ฉํ ๋์ Import:
๋ฉ์ธ ์ ํ๋ฆฌ์ผ์ด์ ์ปดํฌ๋ํธ(์:
App.js)์์React.lazy๋ฅผ ์ฌ์ฉํ์ฌMyComponent๋ฅผ ๋์ ์ผ๋ก importํฉ๋๋ค:// App.js import React, { Suspense } from 'react'; const MyComponent = React.lazy(() => import('./MyComponent')); function App() { return (}>My App
Loading MyComponent...